/**
 * 版权所有 2009-2012山东新北洋信息技术股份有限公司
 * 保留所有权利。
 */
package com.linyaonan.leetcode.easy._38;

/**
 * 报数序列是一个整数序列，按照其中的整数的顺序进行报数，得到下一个数。其前五项如下：
 *
 * 1.     1
 * 2.     11
 * 3.     21
 * 4.     1211
 * 5.     111221
 *
 * 1 被读作  "one 1"  ("一个一") , 即 11。
 * 11 被读作 "two 1s" ("两个一"）, 即 21。
 * 21 被读作 "one 2",  "one 1" （"一个二" ,  "一个一") , 即 1211。
 *
 * 给定一个正整数 n（1 ≤ n ≤ 30），输出报数序列的第 n 项。
 *
 * 注意：整数顺序将表示为一个字符串。
 *
 * @ProjectName: leetcode
 * @Package: com.linyaonan.leetcode.easy._38
 * @ClassName: CountAndSay
 * @Author: linyaonan
 * @Date: 2019/10/15 21:37
 */
public class CountAndSay {
    public String countAndSay(int n) {
        if (n == 1) {
            return "1";
        }
        if (n == 2) {
            return "11";
        }
        int cur = 3;
        StringBuilder stringBuilder = new StringBuilder();
        stringBuilder.append("11");
        while(cur <= n) {
            // 取出本次原数值
            String s = stringBuilder.toString();
            StringBuilder isBuffer = new StringBuilder();
            char[] chars = s.toCharArray();
            int inCount = 1;
            for (int i = 1; i < chars.length; i++) {
                // 与前一个相等
                if (chars[i - 1] == chars[i]) {
                    inCount++;
                } else {
                    isBuffer.append(inCount).append(chars[i - 1]);
                    inCount = 1;
                }
            }
            isBuffer.append(inCount).append(chars[chars.length - 1]);
            stringBuilder = isBuffer;
            // 遍历计数器+1
            cur++;
        }
        return stringBuilder.toString();
    }
}
